import re
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

def match_and_get_time(text):
    """
    匹配三种内容：
    1.今天 00:51
    2.05月13日 21:47
    3.2024-12-28 21:33:20
    4.19分钟前 / 1小时前
    需要将这三种情况，全部转化成yyyy-mm-dd hh-mm-ss的格式
    """
    
    now = datetime.now()

    # 匹配：今天 00:51
    match_today = re.search(r'今天\s+(\d{2}):(\d{2})', text)
    if match_today:
        hour, minute = map(int, match_today.groups())
        dt = datetime(now.year, now.month, now.day, hour, minute)
        return dt.strftime("%Y-%m-%d %H:%M:%S")

    # 匹配：05月13日 21:47
    match_md = re.search(r'(\d{2})月(\d{2})日\s+(\d{2}):(\d{2})', text)
    if match_md:
        month, day, hour, minute = map(int, match_md.groups())
        dt = datetime(now.year, month, day, hour, minute)
        return dt.strftime("%Y-%m-%d %H:%M:%S")

    # 匹配：2024-12-28 21:33:20
    match_full = re.search(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})', text)
    if match_full:
        dt = datetime.strptime(match_full.group(1), "%Y-%m-%d %H:%M:%S")
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    
    # 4. 分钟前（如“19分钟前”）
    match_min = re.search(r'(\d+)分钟前', text)
    if match_min:
        minutes = int(match_min.group(1))
        dt = now - timedelta(minutes=minutes)
        return dt.strftime("%Y-%m-%d %H:%M:%S")

    # 5. 小时前（如“1小时前”）
    match_hour = re.search(r'(\d+)小时前', text)
    if match_hour:
        hours = int(match_hour.group(1))
        dt = now - timedelta(hours=hours)
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    
    print(f"无法识别时间格式:{text}")
    assert False
    
# 将数据库中的datetime类型转化为YYYY-MM-DD HH:MM:SS格式
def datetime_to_str(dt):
    # 如果传入的对象为date对象则进行转换，否则无需转换
    if isinstance(dt, datetime):
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    return dt

# 判断输入的日期与当前日期是否超过一天
def is_over_one_day(dt):
    now = datetime.now()
    delta = now - dt
    if delta.days > 0:
        return True
    return False

# 取当前时间前一个月的日期，格式为YYYY-MM-DD HH:MM:SS
def get_last_month_date():
    # 当前时间
    now = datetime.now()
    one_month_ago = now - relativedelta(months=1)
    # 只保留日期部分
    result = one_month_ago.date()
    return result

# 取当前时间前一周的日期，格式为YYYY-MM-DD HH:MM:SS
def get_last_week_date():
    # 当前时间
    now = datetime.now()
    one_week_ago = now - relativedelta(weeks=1)
    # 只保留日期部分
    result = one_week_ago.date()
    return result

# 获取当前的日期和时间 格式为YYYY-MM-DD HH:MM:SS
def get_current_date():
    now = datetime.now()
    return now.strftime("%Y-%m-%d %H:%M:%S")


# 判断当前输入的时间是否在30分钟以内，输入数据为datetime对象
def is_within_30_minutes(dt):
    now = datetime.now()
    delta = now - dt
    if delta.total_seconds() <= 30 * 60:
        return True
    return False

# 是否超过一个月
def is_over_one_month(dt):
    now = datetime.now()
    delta = now - dt
    if delta.days > 30:
        return True
    return False
